parser grammar XMLParser;

options {
  language = Java;
  tokenVocab = XMLexer;
}

// Referencia: http://www.antlr.org/wiki/display/ANTLR3/2.+Parser

xmldocument : element[0] ;

element [int n_autores] returns [int soy_autor = 0]
  : openid=startTag (updated_autores=element[updated_autores] | TEXT)* closeid=endTag
    { 
      // Comprobar que cada tag de apertura tenga 
      // su tag de cierre correspondiente
      if (!openid.equals(closeid)) {
        throw new MismatchedTokenException();
      }
      
      if (openid.equals("libro")) {
        soy_autor = 0;
        System.out.println(updated_autores);
        if (updated_autores == 0) {
          throw new FailedPredicateException();
        }
      } else if (openid.equals("autor")) {
        soy_autor = n_autores + 1;
      } else {
        soy_autor = n_autores;
      }
    }
  ;
  catch [FailedPredicateException ex] {
      System.out.println("Libro sin autor!");
  }
  catch [MismatchedTokenException ex] {
      System.out.println("Tag de apertura sin tag de cierre!");
  }
  
startTag returns [String id]
  : OPENTAG openid=ID (attribute)* CLOSETAG { $id = $openid.getText(); }
  ;
attribute 
  : ID ATTR_EQ ATTR_VALUE
  ;
endTag returns [String id]
  : ENDTAG closeid=ID CLOSETAG { $id = $closeid.getText(); }
  ;